﻿#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#pragma once
#include "SARibbonMainWindow.h"
#include "ui_mainwindow.h"
#include "libhander.h"
#include "object_struct.h"

#include <QAbstractButton>
#include <QAction>
#include <QApplication>
#include <QButtonGroup>
#include <QComboBox>
#include <QCalendarWidget>
#include <QDebug>
#include <QDockWidget>
#include <QElapsedTimer>
#include <QFile>
#include <QFileDialog>      // 读取文件用的
#include <QFontComboBox>
#include <QGraphicsScene>
#include <QHeaderView>
#include <QIcon>            // 图标相关
#include <QLabel>
#include <QLineEdit>
#include <QMenu>
#include <QMessageBox>
#include <QPushButton>
#include <QRadioButton>
#include <QProgressBar>
#include <QSpinBox>
#include <QStatusBar>
#include <QTextEdit>
#include <QTextStream>
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QXmlStreamWriter>
#include <QMessageBox>
#include <QShortcut>
#include <QLabel>
#include <QLineEdit>
#include <QDialogButtonBox>

#include "SARibbonApplicationButton.h"
#include "SARibbonBar.h"
#include "SARibbonButtonGroupWidget.h"
#include "SARibbonCategory.h"
#include "SARibbonCheckBox.h"
#include "SARibbonColorToolButton.h"
#include "SARibbonComboBox.h"
#include "SARibbonCustomizeDialog.h"
#include "SARibbonCustomizeWidget.h"
#include "SARibbonGallery.h"
#include "SARibbonLineEdit.h"
#include "SARibbonMenu.h"
#include "SARibbonPannel.h"
#include "SARibbonQuickAccessBar.h"
#include "SARibbonToolButton.h"
#include "colorWidgets/SAColorGridWidget.h"
#include "colorWidgets/SAColorPaletteGridWidget.h"
#include "SARibbonSystemButtonBar.h"


// 窗体间的头文件
#include "QtWidgetsMySmoother.h"
#include "QtWidgetsMyDepth.h"


//class SARibbonCategory;
//class SARibbonContextCategory;
//class SARibbonCustomizeWidget;
//class SARibbonActionsManager;
//class SARibbonQuickAccessBar;
//class SARibbonButtonGroupWidget;
//class SARibbonPannel;
//class QTextEdit;
//class QComboBox;
//class QCloseEvent;
//class QLineEdit;





class MainWindow : public SARibbonMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget* par = nullptr);
    ~MainWindow();

signals:
    //void sendRoot(osg::ref_ptr<osg::Group> _root); // 发送节点信号

private:
    // UI
    Ui::MainWindow ui;
    QStatusBar* statusBar;          // 状态栏
    QDockWidget* logDockWidget;     // 日志
    QDockWidget* consoleWidget;     // 控制台
    QDockWidget* treeDockWidget;    // 树容器
    QTreeWidget* treeWidget;        // 树
    // 挂载到树上的节点
    QTreeWidgetItem* treeRoot;          // 工程根节点
    QTreeWidgetItem* sceneRoot;         // 场景根节点
    QTreeWidgetItem* backgroundRoot;    // 背景根节点
    QTreeWidgetItem* axisRoot;          // 场景坐标系节点
    QTreeWidgetItem* gridRoot;          // 参考网格节点
    QTreeWidgetItem* gridXYRoot;        // 参考网格节点 xy
    QTreeWidgetItem* gridXZRoot;        // 参考网格节点 xz
    QTreeWidgetItem* gridYZRoot;        // 参考网格节点 yz

    QAction* actGridSet;    // 网格控制按钮
    QAction* actGridx;
    QAction* actGridy;
    QAction* actGridz;

    SARibbonColorToolButton* bgcolorButton;

    QAction* actTransform;  // 平移
    QAction* actRotate;     // 旋转
    QAction* actScale;      // 缩放
    
    QAction* actBoxSelect;  // 框选工具

    QProgressBar* mainProgressBar;  // 主
    boost::shared_ptr<pcl::visualization::PCLVisualizer> vtkviewer;

    // 初始化状态栏
    void initializeCenterWidget();      // 初始化中心引擎
    void initializeStatusBar();         // 初始化状态栏铆接部件
    void initializeLogDockWidget();     // 初始化日志铆接部件
    void initializeConsoleDockWidget(); // 初始化控制台铆接控件
    void initializeTreeDockWidget();    // 初始化树铆接控件

    void initializeScene();             // 初始化场景

    // qt Func
    void additem(const QString& _filepath, int _filetype);  // 添加Item
    void MainWindow::deleteitem(QTreeWidgetItem* _parentitem, QString qstrtype);    // 删除Item
    bool gridmeunchanged();     // 判断3个初始化视口是否被开启

    // osg func
    void addModel(const QString& _filepath);    // 添加模型到modenode
    void addCloud(const QString& _filepath);    // 添加点云到cloudnode
    void addimage(const QString& _filepath);    // 添加图像到imagenode

    void removeAllFileNode();   // 移除全部 模型+点云+图像等
    void removeAllModel();      // 移除全部 模型
    void removeAllCloud();      // 移除全部 点云
    void removeAllImage();      // 移除全部 图像
    void removeNode(const int& _parentIndex,const int& _index);      // 移除特定的节点

    osg::Node* createAxis(osgViewer::Viewer* _viewer);      // 创建非交互坐标轴
    osg::Node* createGrid_xy(osgViewer::Viewer* _viewer);   // 创建非自适应格网_xy平面;
    osg::Node* createGrid_xz(osgViewer::Viewer* _viewer);   // 创建非自适应格网_xz平面;
    osg::Node* createGrid_yz(osgViewer::Viewer* _viewer);   // 创建非自适应格网_yz平面;

    void setGridShowOrHide(bool _isshow);       // 参考网格的显示与隐藏
    void setGridShowOrHide_xy(bool _isshow);    // 参考网格的显示与隐藏 - z 平面
    void setGridShowOrHide_xz(bool _isshow);    // 参考网格的显示与隐藏 - y 平面
    void setGridShowOrHide_yz(bool _isshow);    // 参考网格的显示与隐藏 - x 平面

    void setViewBackGroundColor(const QColor& _color);      // 设置视口背景颜色

    int convertOsgGeometryToTriMesh(osg::ref_ptr<osg::Geometry > _geometry, TriMesh& _trimesh); // 将geometry转换为TriMesh对象

    // 模型框选相关
    //osg::Camera* createHUD(osg::Viewport* _vp);

    // 碰撞检测
    /*
        * func:
    */
    int getdeeping(osg::ref_ptr<osg::Node>_model, osg::ref_ptr<osg::Group>_cloud, std::vector<float>& _distance);
    

    // pcl_func
    int geode2cloudptr(osg::ref_ptr<osg::Geode> _geode, PointCloudStruct _cloudobject);    // osg点云对象转换为pcl点云对象;

    // object
    osg::ref_ptr<osg::Group> root;              // 用于存放全部图元的根节点
    osg::ref_ptr<osg::Group> backgroundNode;    // 场景节点
    osg::ref_ptr<osg::Group> modelNode;         // 模型对象节点
    osg::ref_ptr<osg::Group> cloudNode;         // 点云对象节点
    osg::ref_ptr<osg::Group> imageNode;         // 图像对象节点

    osg::ref_ptr<osg::Group> selectNode;        // 选矿对象节点 (DBTree 不可见)

    PointCloudStruct active_cloud;              // 活动点云对象
    ModelStruct active_model;                   // 活动模型对象

    // 创建ribbon-application菜单示例
    void createRibbonApplicationButton();
    // 创建main菜单示例
    void createCategoryMain(SARibbonCategory* page);    // main 选项卡布局函数
    void createCategoryViewer(SARibbonCategory* page);  // viewer 选项卡布局函数
    void createCategoryTest(SARibbonCategory* page);    // test 选项卡布局函数
    void createCategoryCloud(SARibbonCategory* page);   // cloud 选项卡布局函数
    void createCategoryOther(SARibbonCategory* page);   // other 选项卡布局函数
    // 特色功能 面板选项卡
    void createCategoryRubbing(SARibbonCategory* page); // Rubbing 选项卡布局函数
    
    
    void createCategoryDelete(SARibbonCategory* page);
    void createCategorySize(SARibbonCategory* page);
    void createCategoryColor(SARibbonCategory* page);
    void createContextCategory1();
    void createContextCategory2();
    void createContextCategoryPage1(SARibbonCategory* page);
    void createContextCategoryPage2(SARibbonCategory* page);
    void createQuickAccessBar();
    void createRightButtonGroup();
    void createWindowButtonGroupBar();

    // 创建ActionsManager，实现actions的管理以及SARibbonBar的自定义
    void createActionsManager();
    QAction* createAction(const QString& text, const QString& iconurl, const QString& objName);
    QAction* createAction(const QString& text, const QString& iconurl);
private slots:

    void on_act_inputfile_triggered();
    void on_act_removefile_all_triggered();
    void on_act_removefile_model_triggered();
    void on_act_removefile_cloud_triggered();
    void on_act_removefile_image_triggered();
    void on_createaxis();
    void on_creategrid_xy();
    void on_creategrid_xz();
    void on_creategrid_yz();
    void on_act_gridset_triggered();
    void on_act_gridxset_triggered();
    void on_act_gridyset_triggered();
    void on_act_gridzset_triggered();
    void on_bgcolorButton_ColorClicked(const QColor& _color, bool _on);

    void on_treeWidget_rightButtonClicked(QTreeWidgetItem* _item,int _column);
    void on_treeWidget_itemActivated(QTreeWidgetItem* _item, int _column);  // 项目被激活时；

    void on_act_boxselect_triggered();  //选中按钮

    // Rub 面板槽函数
    void on_act_mysmoother_triggered();     // 自定义平滑算法窗口弹出
    void on_act_mydepth_triggered();        // 深度映射算法窗口弹出



    void onMenuButtonPopupCheckableTest(bool b);
    void onInstantPopupCheckableTest(bool b);
    void onDelayedPopupCheckableTest(bool b);
    void onMenuButtonPopupCheckabletriggered(bool b);
    void onInstantPopupCheckabletriggered(bool b);
    void onDelayedPopupCheckabletriggered(bool b);
    void onShowContextCategory(bool on);
    void onStyleClicked(int id);
    void onActionCustomizeTriggered(bool b);
    void onActionCustomizeAndSaveTriggered(bool b);
    void onActionCustomizeAndSaveWithApplyTriggered(bool b);
    void onActionHelpTriggered();
    void onActionRemoveAppBtnTriggered(bool b);
    void onActionUseQssTriggered();
    void onActionLoadCustomizeXmlFileTriggered();
    void onActionWindowFlagNormalButtonTriggered(bool b);

    void onFontComWidgetCurrentFontChanged(const QFont& f);
    void onActionFontLargerTriggered();
    void onActionFontSmallerTriggered();
    void onActionWordWrapTriggered(bool b);
    void onButtonGroupActionTriggered(QAction* act);
    void onColorButtonColorClicked(const QColor& c, bool on);
    void onRibbonThemeComboBoxCurrentIndexChanged(int index);
    void onActionHideActionTriggered(bool on);
    // 切换所有action是否可见
    void onActionVisibleAllTriggered(bool on);
    // 居中对齐checkbox的槽
    void onCheckBoxAlignmentCenterClicked(bool checked);

private:
    // 创建其它actions，这些actions并不在SARibbonBar管理
    void createOtherActions();


   

protected:
    void closeEvent(QCloseEvent* e) override;

private:
    SARibbonContextCategory* mContextCategory;
    SARibbonContextCategory* mContextCategory2;
    SARibbonCustomizeWidget* mWidgetForCustomize;
    QTextEdit* mTextedit;
    SARibbonActionsManager* mActionsManager;
    int mTagForActionText;
    int mTagForActionIcon;
    QMenu* mMenuApplicationBtn;
    QComboBox* mComboboxRibbonTheme;
    QLineEdit* mSearchEditor { nullptr };
    //
    QAction* mActionWordWrap { nullptr };
    QAction* mActionDisable { nullptr };
    QAction* mActionUnlock { nullptr };
    QAction* mActionSetTextTest { nullptr };
    QAction* mActionShowTest { nullptr };
    QAction* mActionHideAction2 { nullptr };
    QAction* mActionHideAction4 { nullptr };
    QAction* mActionHideShowTextAct2 { nullptr };
    QAction* mActionHideShowTextAct3 { nullptr };
    QAction* mActionHideShowTextAct4 { nullptr };
    //
    QAction* mOtherAction1 { nullptr };
    QAction* mOtherAction2 { nullptr };
    QAction* mOtherAction3 { nullptr };
    QAction* mOtherAction4 { nullptr };
    QAction* mOtherAction5 { nullptr };
    QAction* mOtherActionIcon1 { nullptr };
    SARibbonPannel* mPannelVisbileExample { nullptr };
    //
    QAction* mActionVisibleAll { nullptr };    ///< 控制所有action是否可见的开关
    bool mHasApplyCustomizeXmlFile { false };  /// 程序启动后是否应用上次修改
};

#endif  // MAINWINDOW_H
